/**
 * openGL设备管理类-gl的基本设置，gl设备的获取，屏幕参数等
 * @date   2011-3-21
 * @author tianye
 */
package cn.edu.dlut.WingGame.Graphic;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.app.Activity;
import android.opengl.GLU;
import cn.edu.dlut.WingGame.BaseType.WingColor;

public class GLDevice {
	private static Activity mainActivity;
	private static GL10 gl = null;// openGL设备-便于所有可绘制图元引用
	// 屏幕大小参数
	public static int ScreenWidth;
	public static int ScreenHeight;

	private static float skewingX;
	private static float skewingY;

	private static float alpha = 1.0f;

	public static WingColor bkColor = new WingColor();// 背景填充颜色
	public static boolean isLowQuality = false;

	private static boolean isAlpha = false;// 是否使用alpha混色
	private static boolean isMask = false; // 是否使用

	public static void setActivity(Activity mainActivity) {
		GLDevice.mainActivity = mainActivity;
	}

	public static Activity getActivity() {
		return mainActivity;
	}

	public static void setGL(GL10 t_gl) {// 更新gl设备
		gl = t_gl;
	}

	public static GL10 getGL() {// 获得gl设备
		return gl;
	}

	public static void setBKColor(int r, int g, int b) {
		bkColor.setColor(r, g, b);
	}

	public static void setQuality(boolean islow) {
		isLowQuality = islow;
	}

	public static void setScreen(int width, int height) {
		ScreenWidth = width;
		ScreenHeight = height;
	}

	public static void setSkewing(float x, float y) {
		skewingX = x;
		skewingY = y;
	}

	public static void skewingXY(float x, float y) {
		skewingX += x;
		skewingY += y;
	}

	// Render各过程GL设备的更新调整,下面三个函数分别对应着GLRender类中的三个接口
	public static void onSurfaceCreated(GL10 t_gl, EGLConfig config) {
		gl = t_gl;// 更新gl设备

		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 清除屏幕
		gl.glLoadIdentity();

		gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);// 告诉系统对透视进行修正
		gl.glClearColor(bkColor.getRf(), bkColor.getGf(), bkColor.getBf(), 1);// 背景黑色

		if (isLowQuality)
			gl.glShadeModel(GL10.GL_FLAT);
		else
			gl.glShadeModel(GL10.GL_SMOOTH);// 启用阴影平滑 【使用 GL10.GL_SMOOTH 可以提高画质
											// 但效率不高】

		gl.glDisable(GL10.GL_LIGHTING);// 关闭光照
		gl.glDisable(GL10.GL_DEPTH_TEST);// 禁用深度缓存 【提高效率】
		gl.glDisable(GL10.GL_MULTISAMPLE);

		// gl.glClearDepthf(1.0f);// 设置深度缓存
		// gl.glEnable(GL10.GL_DEPTH_TEST);// 启用深度测试
		// gl.glDepthFunc(GL10.GL_LEQUAL); // 所做深度测试的类型

		// 设置双面显示,背面裁切 [3D]
		// gl.glFrontFace(GL10.GL_CCW);
		// gl.glEnable(GL10.GL_CULL_FACE);
		// gl.glCullFace(GL10.GL_BACK);

	}

	public static void onSurfaceChanged(GL10 t_gl, int width, int height) {
		gl = t_gl;// 更新gl设备
		setScreen(width, height);// 设置屏幕大小

		gl.glViewport(0, 0, width, height);// 设置 OpenGL 场景的大小
		gl.glMatrixMode(GL10.GL_PROJECTION); // 设置投影矩阵
		gl.glLoadIdentity();// 重置投影矩阵

		// 设置视口的大小
		GLU.gluOrtho2D(gl, 0, width, height, 0);
		// gl.glOrthof(0.0F, ScreenWidth, ScreenHeight, 0.0F, -1.0F, 1.0F); //正交

		// 重置模型矩阵
		gl.glMatrixMode(GL10.GL_MODELVIEW);
		gl.glLoadIdentity();

		GLTexContainer.rebindTexture();

	}

	public static void onDrawFrame(GL10 t_gl) {
		gl = t_gl;// 更新gl设备
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 清除屏幕
		gl.glLoadIdentity();// 重置模型矩阵
	}

	// 启用/关闭混色
	public static void enableBlend() {
		// gl.glDisable(GL10.GL_DEPTH_TEST);
		if (!isAlpha && !isMask) {
			gl.glEnable(GL10.GL_BLEND);
			gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);// 设置混合函数
			isAlpha = true;
		}
	}

	public static void disableBlend() {
		if (isAlpha && !isMask) {
			gl.glDisable(GL10.GL_BLEND);
			isAlpha = false;
		}
		// gl.glEnable(GL10.GL_DEPTH_TEST);// 启用深度测试
		// gl.glDepthFunc(GL10.GL_LEQUAL); // 所做深度测试的类型
	}

	public static void enableMask(boolean flag) {
		if (flag) {
			gl.glEnable(GL10.GL_BLEND);
			gl.glBlendFunc(GL10.GL_DST_COLOR, GL10.GL_ZERO);// 设置混合函数
			isAlpha = true;
			isMask = true;
		} else if (isAlpha) {
			gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE);// 设置混合函数
			isAlpha = true;
			isMask = true;
		}

	}

	public static void disableMask() {
		if (isMask) {
			gl.glDisable(GL10.GL_BLEND);
			isAlpha = false;
			isMask = false;
		}
	}

	public static void viewTranslate(float x, float y) {
		gl.glTranslatef(x + skewingX, y + skewingY, 0f);
	}

	public static void setAlpha(float alpha) {
		GLDevice.alpha = alpha;
	}

	public static float getAlpha() {
		return alpha;
	}

}
